//
//  HMStatusViewModel.swift
//  Weibo24
//
//  Created by apple on 17/3/30.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
import YYText

//  处理cell数据显示逻辑
class HMStatusViewModel: NSObject {

    //  引用微博模型数据
    var status: HMStatus? {
        didSet {
            //  获取认证类型的数据
            let verifiedType = status?.user?.verified_type ?? 0
            //  处理认证类型图片的图片
            handleVerifiedTypeImage(verifiedType: verifiedType)
            //  获取会员等级
            let mbrank = status?.user?.mbrank ?? 0
            //  处理会员等级图片 1-6
            handleMbrankImage(mbrank: mbrank)
            if let currentStatus = status {
                //  处理转发微博显示内容
                handleRetweetContent(status: currentStatus)
            }
            //  处理来源数据
            handleSourceContent(source: status?.source ?? "")
            
            //  处理原创微博富文本
            originalAttributedString = handleEmoticonAttributedString(status: status?.text ?? "", isOriginal: true)
        }
    }
    
    //  原创微博的富文本
    var originalAttributedString: NSAttributedString?
    //  转发微博的富文本
    var retweetAttributedString: NSAttributedString?
    
    
    //  转发微博内容
    var retweetContent: String?
    //  认证类型等级图片
    var verifiedTypeImage: UIImage?
    //  会员等级图片
    var mbrankImage: UIImage?
    //  来源
    var sourceContent: String?
    //  只读计算属性,每次获取时间的时候都要跟当前时间进行对比
    var timeContent: String? {
        //  判断时间是否为空
        guard let createAt = status?.created_at else {
            return nil
        }
        //  代码执行到此,表示时间对象不为nil
        
        /*
            时间格式化的逻辑
            1. 判断是否是今年
                是否是今天
                    是否是1分钟之前
                        "刚刚"
                    是否是1小时之前
                        "xx分钟前"
                    其它
                        "xx小时前"
                是否昨天
                    "昨天 10:11"
                其它
                    "03-20 20:20"
         
               不是今年
                    "2016-10-10 10:20"
         */
        
        
        let dt = DateFormatter()
        if isThisYear(createAt: createAt) {
            //  今年(获取当前的日历对象)
            let calender = Calendar.current
            //  是否是今天
            if calender.isDateInToday(createAt) {
                //  是今天
                //  获取发微博时间和当前时间的差1. createAt.timeIntervalSince(Date())
                //  2.createAt.timeIntervalSinceNow计算发微博时间和当前时间的差值,abs 取绝对值
                let timeIntever = abs(createAt.timeIntervalSinceNow)
                
                if timeIntever < 60 {
                    //  1分钟之前
                    return "刚刚"
                } else if timeIntever < 3600 {
                    //  1小时之前
                    let result = Int(timeIntever / 60)
                    return "\(result)分钟前"
                } else {
                    //  其它
                    let result = Int(timeIntever / 3600)
                    return "\(result)小时前"
                }
                
            } else if calender.isDateInYesterday(createAt) {
                //  昨天
                dt.dateFormat = "昨天 HH:mm"
            } else {
                //  其它
                dt.dateFormat = "MM-dd HH:mm"
            }
            
            
        } else {
            //  不是今年
            dt.dateFormat = "yyyy-MM-dd HH:mm"
        }
        
        return dt.string(from: createAt)
    }
    
    //  根据传入的时间判断是否是今年
    fileprivate func isThisYear(createAt: Date) -> Bool {
        let dt = DateFormatter()
        //  只获取年份
        dt.dateFormat = "yyyy"
        //  获取发微博时间的年份
        let creatAtYear = dt.string(from: createAt)
        //  获取当前时间的年份
        let currentDateYear = dt.string(from: Date())
        //  判断是否是同一年
        return creatAtYear == currentDateYear
    }
    
    //  处理微博富文本的方法
    fileprivate func handleEmoticonAttributedString(status: String, isOriginal: Bool) -> NSAttributedString {
        //  把微博内容字符串转成富文本
        let attributedStr = NSMutableAttributedString(string: status)
        //  匹配表情描述
        let regular = try! NSRegularExpression(pattern: "\\[\\w+\\]", options: [])
        //  匹配微博内容的表情描述
        let matchReulstArray = regular.matches(in: status, options: [], range: NSMakeRange(0, (status as NSString).length))
        //  倒着替换表情描述,因为正着替换会出现富文本的长度变短,到时范围超出
        for matchResult in matchReulstArray.reversed() {
            //  匹配表情描述的范围
            let range = matchResult.range
            //  根据表情的范围获取表情描述
            let chs = (status as NSString).substring(with: range)
            //  根据表情描述查找表情模型
            if let emoticon = HMEmoticonTools.sharedTools.selectedEmoticon(chs: chs) {
                //  根据表情图片创建富文本
                let image = UIImage(named: emoticon.path!)!
                //  要使用YYText创建图片的富文本否则显示不出来表情
                let emoticonAttributedStr = NSAttributedString.yy_attachmentString(withEmojiImage: image, fontSize: 13)!
                //  根据表情模型创建表情富文本
//                let emoticonAttributedStr = NSAttributedString.attributedStringWithEmoticon(emoticon: emoticon, font: UIFont.systemFont(ofSize: 13))
                //  根据表情描述的范围替换表情富文本
                attributedStr.replaceCharacters(in: range, with: emoticonAttributedStr)
                
            }
        }
        
        if isOriginal {
            //  原创微博的富文本的颜色
            //  设置整体富文本的字体大小,防止大小不统一
            attributedStr.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 13), NSForegroundColorAttributeName: UIColor.darkGray], range: NSMakeRange(0, attributedStr.length))
        } else {
            //  转发微博的富文本的颜色
            attributedStr.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 13), NSForegroundColorAttributeName: UIColor.lightGray], range: NSMakeRange(0, attributedStr.length))
        }
        
        
        //  代码执行到此表情富文本替换成功
        //  匹配高亮文字
//        //  获取富文本对应的字符串
//        let statusText = attributedStr.string
//        //  根据富文本的字符串匹配高亮文字
//        let matchHighlightedResult = try! NSRegularExpression(pattern: "@[^:]+", options: []).matches(in: statusText, options: [], range: NSMakeRange(0, (statusText as NSString).length))
//        //  遍历匹配的结果
//        for matchHightlighted in matchHighlightedResult {
//            //  获取匹配的高亮文字的范围
//            let highlightedRange = matchHightlighted.range
//            //  高亮富文本的字体颜色
//            let color = UIColor(red: 80 / 255, green: 125 / 255, blue: 215 / 255, alpha: 1)
//            //  给匹配高亮范围的富文本添加文字颜色
//            attributedStr.addAttribute(NSForegroundColorAttributeName, value: color, range: highlightedRange)
//            //  创建文本高亮对象
//            let textHighlight = YYTextHighlight()
//            //  点击高亮文字的背景色
//            let bgColor = UIColor(red: 177 / 255, green: 215 / 255, blue: 255 / 255, alpha: 1)
//            //  创建边框对象
//            let textBorder = YYTextBorder(fill: bgColor, cornerRadius: 3)
//            //  设置边框的内间距
//            textBorder.insets = UIEdgeInsets(top: 1, left: 0, bottom: 0, right: 0)
//            //  设置边框对象
//            textHighlight.setBackgroundBorder(textBorder)
//            //  设置高亮
//            attributedStr.yy_setTextHighlight(textHighlight, range: highlightedRange)
//            
//        }
        
        //  匹配@xxx:
        addHighlightedAttributedStr(attributedStr: attributedStr, pattern: "@[^:]+")
        
        //  匹配#xxx#:
        addHighlightedAttributedStr(attributedStr: attributedStr, pattern: "#[^#]+#")
        
        //  匹配https:
        addHighlightedAttributedStr(attributedStr: attributedStr, pattern: "http[s]?://[^\\s\\u4e00-\\u9fa5]+")
       
        
        
        return attributedStr
        
    }
    
    //  添加富文本高亮
    private func addHighlightedAttributedStr(attributedStr: NSMutableAttributedString, pattern: String) {
        //  获取富文本对应的字符串
        let statusText = attributedStr.string
        //  根据富文本的字符串匹配高亮文字
        let matchHighlightedResult = try! NSRegularExpression(pattern: pattern, options: []).matches(in: statusText, options: [], range: NSMakeRange(0, (statusText as NSString).length))
        //  遍历匹配的结果
        for matchHightlighted in matchHighlightedResult {
            //  获取匹配的高亮文字的范围
            let highlightedRange = matchHightlighted.range
            //  高亮富文本的字体颜色
            let color = UIColor(red: 80 / 255, green: 125 / 255, blue: 215 / 255, alpha: 1)
            //  给匹配高亮范围的富文本添加文字颜色
            attributedStr.addAttribute(NSForegroundColorAttributeName, value: color, range: highlightedRange)
            //  创建文本高亮对象
            let textHighlight = YYTextHighlight()
            //  点击高亮文字的背景色
            let bgColor = UIColor(red: 177 / 255, green: 215 / 255, blue: 255 / 255, alpha: 1)
            //  创建边框对象
            let textBorder = YYTextBorder(fill: bgColor, cornerRadius: 3)
            //  设置边框的内间距
            textBorder.insets = UIEdgeInsets(top: 1, left: 0, bottom: 0, right: 0)
            //  设置边框对象
            textHighlight.setBackgroundBorder(textBorder)
            //  设置高亮
            attributedStr.yy_setTextHighlight(textHighlight, range: highlightedRange)
            
        }

    }
    
    
    //  处理来源数据
    fileprivate func handleSourceContent(source: String) {
        print(source)
        //<a href="http://app.weibo.com/t/feed/6vtZb0" rel="nofollow">微博 weibo.com</a>
        //  开始截取的范围  结束截取的范围
        if let startRange = source.range(of: "\">"),  let endRange = source.range(of: "</") {
            //  表示在字符串中最大的光标索引
            let startIndex = startRange.upperBound
            //  表示在字符串中最小的光标索引
            let endIndex = endRange.lowerBound
            //  完成字符串的截取
            sourceContent = "来自: " + source.substring(with: startIndex..<endIndex)
            
        }
    }
    
    //  处理转发微博显示内容的逻辑
    fileprivate func handleRetweetContent(status: HMStatus) {
        //  判断是否有转发微博
        if let retweetStatus = status.retweeted_status {
            if let screenName = retweetStatus.user?.screen_name, let text = retweetStatus.text {
                //  多个可选的判断
                retweetContent = "@\(screenName): \(text)"
                
                //  设置转发微博富文本
                retweetAttributedString = handleEmoticonAttributedString(status: retweetContent!, isOriginal: false)
            }
        }
        
    }
    
    //  处理会员等级图片 1-6
    fileprivate func handleMbrankImage(mbrank: Int) {
        if mbrank >= 1 && mbrank <= 6 {
            mbrankImage = UIImage(named: "common_icon_membership_level\(mbrank)")
        }
    }
    
    
    //  认证类型 -1：没有认证，1，认证用户，2,3,5: 企业认证，220: 达人
    fileprivate func handleVerifiedTypeImage(verifiedType: Int) {
        switch verifiedType {
        case 1:
            verifiedTypeImage = UIImage(named: "avatar_vip")
        case 2, 3, 5:
            verifiedTypeImage = UIImage(named: "avatar_enterprise_vip")
        case 220:
            verifiedTypeImage = UIImage(named: "avatar_grassroot")
        default:
            verifiedTypeImage = nil
        }
    }
    
}
